﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

/*
虚析构函数：在析构函数前加上virtual关键字，即为虚析构函数。
当父类指针指向子类对象时，如Father *f = new Son;，delete f;会在静态编译时绑定父类的析构函数，
导致子类析构函数没调用，可能导致内存泄漏，因此，需要将父类析构函数加上virtual 
*/
class Animal {
public:
	Animal() {
		cout << "Animal 构造函数" << endl;
	}
	/*virtual ~Animal() {
		cout << "Animal 析构函数" << endl;
	}*/
	// 可以声明为纯虚析构函数，让父类成为抽象类
	// 注意，纯虚析构函数需要在类外实现，防止子类由于没有实现父类的纯虚析构函数而成为抽象类 
	virtual ~Animal() = 0;
};
Animal::~Animal() {
	cout << "Animal 纯虚析构函数实现" << endl; 
}

class Son : public Animal {
public:
	Son() {
		cout << "Son 构造函数" << endl;
		pName = new char[64];
		memset(pName, 0, 64);
		strcpy(pName, "如花");
	}
	~Son() {
		cout << "Son 析构函数" << endl;
		if (pName != NULL) {
			delete[] pName; 
		}
	}
public:
	char * pName; 
};

void test01() {
	/*
	Animal 构造函数
	Son 构造函数
	Son 析构函数
	Animal 纯虚析构函数实现
	*/
	Animal *animal = new Son;
	delete animal; 
}

int main()
{

	test01(); 

	system("pause");
	return EXIT_SUCCESS;
}